package ext.tianma.util;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * 导出excel
 * 
 * @author lilin
 *
 */
public class ExportExcelUtil {

	public static void exportExcel(String sheetName, String pathAndName, String[] title, JSONArray jsonArray,
			HSSFWorkbook wb) throws JSONException, IOException {
		// 第一步，创建一个HSSFWorkbook，对应一个Excel文件
		if (wb == null) {
			wb = new HSSFWorkbook();
		}

		// 第二步，在workbook中添加一个sheet,对应Excel文件中的sheet
		HSSFSheet sheet = wb.createSheet(sheetName);

		// 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
		HSSFRow row = sheet.createRow(0);

		// 第四步，创建单元格，并设置值表头 设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

		// 设置为超链接的样式 不生效
		HSSFCellStyle linkStyle = wb.createCellStyle();
		HSSFFont cellFont = wb.createFont();
		cellFont.setUnderline((byte) 1);
		cellFont.setColor(HSSFColor.BLUE.index);
		linkStyle.setFont(cellFont);

		// 声明列对象
		HSSFCell cell = null;

		// 创建标题
		for (int i = 0; i < title.length; i++) {
			cell = row.createCell(i);
			cell.setCellValue(title[i]);
			cell.setCellStyle(style);
		}

		// 创建内容
		for (int i = 0; i < jsonArray.length(); i++) {
			HSSFRow tempRow = sheet.createRow(i + 1);
			JSONObject jsonObjectTemp = jsonArray.getJSONObject(i);
			for (int j = 0; j < jsonObjectTemp.length(); j++) {
				String tempCellName = row.getCell(j).getStringCellValue();
				String tempValue = "";
				if ("序号".equals(tempCellName)) {
					tempValue = String.valueOf(i + 1);
				} else if ("层级".equals(tempCellName)) {
					if(jsonObjectTemp.get("level")!=null && jsonObjectTemp.get("level") instanceof Integer) {
						tempValue =  String.valueOf(jsonObjectTemp.get("level"));
					}
				} else if ("物料编号".equals(tempCellName)) {
					tempValue = (String) jsonObjectTemp.get("partNumber");
					// String numberURL = (String) jsonObjectTemp.get("partNumberURL");
					// HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
					// link.setAddress(numberURL);
					// tempRow.createCell(j).setHyperlink(link);// 设置超链接
					// tempRow.createCell(j).setCellStyle(linkStyle);
					// flag = false;
				} else if ("替代料编号".equals(tempCellName)) {
					Object objTemp = jsonObjectTemp.get("subPart");
					if (objTemp != null) {
						String subPartNumber = "";
						if (objTemp instanceof JSONArray) {
							JSONArray objArray = (JSONArray) objTemp;
							for (int o = 0; o < objArray.length(); o++) {
								JSONObject subObject = objArray.getJSONObject(o);
								String objTempNum = (String) subObject.get("number");
								subPartNumber = subPartNumber + "|" + objTempNum;
							}
							tempValue = "".equals(subPartNumber) ? ""
									: subPartNumber.substring(1, subPartNumber.length());
						}

					}
				} else if ("物料描述".equals(tempCellName)) {
					tempValue = (String) jsonObjectTemp.get("partDescription");
				} else if ("最新版本号".equals(tempCellName)) {
					tempValue = (String) jsonObjectTemp.get("partVersion");
				} else if ("产地视图".equals(tempCellName)) {
					tempValue = (String) jsonObjectTemp.get("viewStr");
				} else if ("状态".equals(tempCellName)) {
					tempValue = (String) jsonObjectTemp.get("partState");
				}
				tempRow.createCell(j).setCellValue(tempValue);
			}
		}

		// 必须在单元格设值以后进行
		// 设置为根据内容自动调整列宽
		for (int k = 0; k < title.length; k++) {
			sheet.autoSizeColumn(k);
		}
		// 处理中文不能自动调整列宽的问题
		setSizeColumn(sheet, title.length);
	}

	/**
	 * 自适应宽度(中文支持)
	 * 
	 * @param sheet
	 * @param size
	 */
	public static void setSizeColumn(HSSFSheet sheet, int size) {
		for (int columnNum = 0; columnNum < size; columnNum++) {
			int columnWidth = sheet.getColumnWidth(columnNum) / 256;
			for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
				HSSFRow currentRow;
				// 当前行未被使用过
				if (sheet.getRow(rowNum) == null) {
					currentRow = sheet.createRow(rowNum);
				} else {
					currentRow = sheet.getRow(rowNum);
				}

				if (currentRow.getCell(columnNum) != null) {
					HSSFCell currentCell = currentRow.getCell(columnNum);
					if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
						int length = currentCell.getStringCellValue().getBytes().length;
						if (columnWidth < length) {
							columnWidth = length;
						}
					}
				}
			}
			sheet.setColumnWidth(columnNum, columnWidth * 256);
		}
	}

}
